package com.luxsoft.siipap.em.replica.importadores.inventarios;

import java.util.Date;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.dao.DataIntegrityViolationException;

import com.luxsoft.siipap.em.replica.importadores.ImportadorSupport;
import com.luxsoft.siipap.em.replica.importadores.dbf.DBFReaderTemplate;
import com.luxsoft.siipap.em.replica.importadores.dbf.DBFRowHandler;
import com.luxsoft.siipap.inventarios.model.Inventario;
import com.luxsoft.siipap.inventarios.model.MovimientoDet;
import com.luxsoft.siipap.model.Periodo;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.util.DBUtils;

/**
 * Permite importar salidas por ventas para un periodo 
 * 
 * TODO Poner columna de Importacion en tablas de inventarios para saber su origen de importacion
 * 
 * @author Ruben Cancino
 *
 */
public class ImportadorDeMovimientos implements DBFRowHandler{
	
	private ImportadorSupport support;
	
	private Logger logger=Logger.getLogger(getClass());
	private DBFReaderTemplate template;
	
	
	public ImportadorDeMovimientos(){
		template=new DBFReaderTemplate();
		template.setTabla("ALMACE");
		support=ImportadorSupport.getInstance();
	}
	
	
	
	public void importar(final Periodo p){
		logger.info("Importando movimientos fac para:"+p);
		template.execute(p,this,true);
	}
	
	

	public void processRow(Map<String, Object> row) throws Exception {
		String tipo=(String)row.get("ALMTIPO");
		if(
				(tipo.equals("FAC")) || 
				(tipo.equals("COM")) ||
				(tipo.equals("RMD"))
				) return;
		MovimientoDet sal=new MovimientoDet();
		sal.setConcepto(tipo);
		sal.setDocumento(getSafaLong(row, "ALMNUMER"));
		sal.setCantidad(getSafaLong(row, "ALMCANTI"));
		sal.setClave(row.get("ALMARTIC").toString());
		String comentario=(String)row.get("ALMOBSER");
		sal.setComentario(comentario);		
		sal.setFecha((Date)row.get("ALMFECHA"));
		sal.setRenglon(getSafaInt(row, "ALMRENGL"));
		sal.setProducto(support.buscarProducto(sal.getClave().trim()));
		
		sal.setSucursal(support.buscarSucursal(getSafaInt(row, "ALMSUCUR")));
				
		try {
			//sal=(MovimientoDet)ServiceLocator2.getUniversalDao().save(sal);
			persistir(sal);
		} catch (DataIntegrityViolationException de) {
			logger.info("Movimiento existente: "+row+ "\n"+de.getRootCause().getMessage());
		}
		
	}
	
	public void persistir(Inventario inv){
		ServiceLocator2.getUniversalDao().save(inv);
	}
	
	public int contar(final Periodo p){
		return 0;
	}
	
	public double getSafaDouble(Map<String, Object> row,String key){
		Number res=(Number)row.get(key);
		return res!=null?res.doubleValue():0;
	}
	
	public long getSafaLong(Map<String, Object> row,String key){
		Number res=(Number)row.get(key);
		return res!=null?res.longValue():0;
	}
	
	public int getSafaInt(Map<String, Object> row,String key){
		Number res=(Number)row.get(key);
		return res!=null?res.intValue():0;
	}
	
	public static void main(String[] args) {
		DBUtils.whereWeAre();
		new ImportadorDeMovimientos()
		//.contar(Periodo.getPeriodoEnUnMes(0, 2008));
		.importar(Periodo.getPeriodoEnUnMes(0, 2009));
	}
}
